#ifndef __VIMOCK_INVOCATION_MATCHER__
#define __VIMOCK_INVOCATION_MATCHER__

#include <memory>
#include <vector>
#include "invocation.hpp"
#include "argument_matcher.hpp"
#include "object.hpp"

namespace vimock {
class _invocation_matcher {
public:
	_invocation_matcher(
		object expected_obj, 
		object expected_func, 
		argument_matcher_vector expected_argument_matchers);
	bool matches(invocation invocation) const;
private:
	object expected_obj;
	object expected_func; 
	argument_matcher_vector expected_argument_matchers;
	bool object_matches(invocation invocation) const;
	bool function_matches(invocation invocation) const;
	bool arguments_match(invocation invocation) const;
	bool arguments_count_matches(object_vector arguments) const;
	bool arguments_content_match(object_vector arguments) const;
};
typedef std::tr1::shared_ptr<_invocation_matcher> invocation_matcher;
}

#endif //__VIMOCK_INVOCATION_MATCHER__ 
